home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / QuickTime VR / MacOS / QuickDraw™ 3D 1.0.6F4 SDK / Development / 3DMF parser / 1.0 version / MF3DPC / MFOBJCTS.H < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-07  |  49.7 KB  |  1,496 lines  |  [TEXT/dosa]

  1. #ifndef MF3DOBJECTS_H
  2. #define    MF3DOBJECTS_H
  3. /*==============================================================================
  4.  *
  5.  *    File:        MFOBJCTS.H
  6.  *
  7.  *    Function:    Structure definitions for all Metafile objects returned
  8.  *                by MF3DReadAnObject() or passed to MF3DWriteAnObject().
  9.  *
  10.  *    Version:    Metafile:    Version 1.0 3DMF files
  11.  *                Package:    Release #2 of this code
  12.  *
  13.  *    Author(s):    Rick Wong (RWW), Duet Development Corp.
  14.  *                John Kelly (JRK), Duet Development Corp.
  15.  *
  16.  *    Copyright:    (c) 1995 by Apple Computer, Inc., all rights reserved.
  17.  *
  18.  *    Change History (most recent first):
  19.  *        FB7_JRK    Pragma macros
  20.  *        FB3_JRK    Added UnknownBinary (ukbn)
  21.  *        Fabio    Changed file name to 8 characters
  22.  *        F3K_RWW    GeneralPolygonHint.
  23.  *        F3A_RWW    MeshEdges and OrientationStyle.
  24.  *        F2S_RWW    BeginGroup changes.
  25.  *        F26_RWW    File created.
  26.  *==============================================================================
  27.  */
  28. #if defined(applec) || defined(__MWERKS__) || defined(THINK_C)
  29. #pragma once
  30. #endif
  31.  
  32. #include "MFSUBOBJ.H"
  33. #include "MFSYSTYP.H"
  34. #include "MFTYPES.H"
  35.  
  36. /*==============================================================================
  37.  *    Generic Object returned by MF3DReadAnObject
  38.  *
  39.  *    Use the objectType field to determine what kind of object this is.
  40.  *    Then, cast the pointer appropriately.
  41.  *==============================================================================
  42.  */
  43. #define    kMF3DObjInvalid                            0
  44.  
  45. typedef struct MF3DVoidObj
  46. {    MF3DObjHeader
  47. } MF3DVoidObj, *MF3DVoidObjPtr;
  48.  
  49. /*==============================================================================
  50.  *    Metafile Header
  51.  *
  52.  *    Always the first object returned by MF3DReadAnObject
  53.  *    Always the first object passed to MF3DWriteAnObject
  54.  *==============================================================================
  55.  */
  56. #define    kMF3DObjMetafile                        MF3DObjectType('3','D','M','F')
  57. #define    kMF3DObjMetafileSwapped                    MF3DObjectType('F','M','D','3')
  58. #define    kMF3DObjMetafileText                    "3DMetafile"
  59.  
  60. #define    kMF3DMaximumRefSeed        0x7FFFFFFF
  61. #define    kMF3DMinimumTypeSeed    0x80000000
  62.  
  63. enum
  64. {    kMF3DFormatNormal    = 0x00000000,
  65.     kMF3DFormatStream    = 0x00000001,
  66.     kMF3DFormatDatabase    = 0x00000002
  67. };
  68. typedef MF3DFlagData    MF3DMetafileFlags;    /* Metafile flags                */
  69.  
  70. typedef    struct MF3DMetafileObj
  71. {    MF3DObjHeader
  72.     MF3DDataFormatEnum            dataFormat;     /* binary, swapped, or text    */
  73.     MF3DUns16                      majorVersion;/* version of metafile format    */
  74.     MF3DUns16                      minorVersion;
  75.     MF3DMetafileFlags            flags;
  76.     MF3DUns32                    refSeed;     /* next available ref num        */
  77.     MF3DInt32                    typeSeed;     /* next available type num        */
  78.     MF3DPositionReferencePtr    tocLocation; /* table of contents            */
  79. } MF3DMetafileObj, *MF3DMetafileObjPtr;
  80.  
  81. /*==============================================================================
  82.  *    Reference
  83.  *
  84.  *    refID == 0 indicates an entire external file
  85.  *    (must be followed by storageObject)
  86.  *
  87.  *    Optionally followed by:
  88.  *        MF3DStorageObjPtr    storageObject;        { 0-1 }
  89.  *==============================================================================
  90.  */
  91. #define    kMF3DObjReference                        MF3DObjectType('r','f','r','n')
  92. #define    kMF3DObjReferenceText                    "Reference"
  93.  
  94. #define    kMF3DReferenceEntireFile    0
  95.  
  96. /* Examples of an MF3DStorageObj are:
  97.  * MF3DMacintoshPathObjPtr and MF3DUnixPathObjPtr
  98.  */
  99. typedef    struct MF3DStorageObj
  100. {    MF3DObjHeader
  101.     MF3DCStringPtr            pathName;
  102. } MF3DStorageObj, *MF3DStorageObjPtr;
  103.  
  104. typedef struct MF3DReferenceObj
  105. {    MF3DObjHeader
  106.     MF3DReferenceID        refID;                /* reference ID                    */
  107. } MF3DReferenceObj, *MF3DReferenceObjPtr;
  108.  
  109. /*==============================================================================
  110.  *    Container
  111.  *
  112.  *    The next object will be a root object.
  113.  *    All objects (until a matching EndContainer is returned) after the
  114.  *        root object are subobjects (modifiers) of the root object.
  115.  *==============================================================================
  116.  */
  117. #define    kMF3DObjContainer                        MF3DObjectType('c','n','t','r')
  118. #define    kMF3DObjContainerText                    "Container"
  119.  
  120. typedef    struct MF3DContainerObj
  121. {    MF3DObjHeader
  122. } MF3DContainerObj, *MF3DContainerObjPtr;
  123.  
  124. /*==============================================================================
  125.  *    EndContainer
  126.  *
  127.  *    The next object will be a root object.
  128.  *    All objects (until a matching EndContainer is returned) after the
  129.  *        root object are subobjects (modifiers) of the root object.
  130.  *==============================================================================
  131.  */
  132. /* ### NOTE: EndContainer is a phantom type (not in the QuickDraw 3D spec ### */
  133. #define    kMF3DObjEndContainer                    MF3DObjectType('e','n','d','c')
  134.  
  135. typedef    struct MF3DEndContainerObj
  136. {    MF3DObjHeader
  137. } MF3DEndContainerObj, *MF3DEndContainerObjPtr;
  138.  
  139. /*==============================================================================
  140.  *    BeginGroup
  141.  *==============================================================================
  142.  */
  143. #define    kMF3DObjBeginGroup                        MF3DObjectType('b','g','n','g')
  144. #define    kMF3DObjBeginGroupText                    "BeginGroup"
  145.  
  146. typedef    MF3DVoidObjPtr    MF3DAnyGroupObjPtr;
  147.  
  148. typedef    struct MF3DBeginGroupObj
  149. {    MF3DObjHeader
  150.     MF3DAnyGroupObjPtr            group;
  151.     MF3DDisplayGroupStateObjPtr    displayState;        /* (optional)            */
  152. } MF3DBeginGroupObj, *MF3DBeginGroupObjPtr;
  153.  
  154. /*==============================================================================
  155.  *    Group
  156.  *==============================================================================
  157.  */
  158. #define    kMF3DObjGroup                            MF3DObjectType('g','r','o','p')
  159. #define    kMF3DObjGroupText                        "Group"
  160.  
  161. typedef    struct MF3DGroupObj
  162. {    MF3DObjHeader
  163. } MF3DGroupObj, *MF3DGroupObjPtr;
  164.  
  165. /*==============================================================================
  166.  *    DisplayGroup (contains drawable objects)
  167.  *
  168.  *    Optionally followed by:
  169.  *        MF3DDisplayGroupStateObjPtr    displayGroupState;    { 0-1 }
  170.  *==============================================================================
  171.  */
  172. #define    kMF3DObjDisplayGroup                    MF3DObjectType('d','s','p','g')
  173. #define    kMF3DObjDisplayGroupText                "DisplayGroup"
  174.  
  175. typedef    struct MF3DDisplayGroupObj
  176. {    MF3DObjHeader
  177. } MF3DDisplayGroupObj, *MF3DDisplayGroupObjPtr;
  178.  
  179. /*==============================================================================
  180.  *    OrderedDisplayGroup
  181.  *
  182.  *    Optionally followed by:
  183.  *        MF3DDisplayGroupStateObjPtr    displayGroupState;    { 0-1 }
  184.  *==============================================================================
  185.  */
  186. #define    kMF3DObjOrderedDisplayGroup                MF3DObjectType('o','r','d','g')
  187. #define    kMF3DObjOrderedDisplayGroupText            "OrderedDisplayGroup"
  188.  
  189. typedef    struct MF3DOrderedDisplayGroupObj
  190. {    MF3DObjHeader
  191. } MF3DOrderedDisplayGroupObj, *MF3DOrderedDisplayGroupObjPtr;
  192.  
  193. /*==============================================================================
  194.  *    IOProxyDisplayGroup
  195.  *
  196.  *    Optionally followed by:
  197.  *        MF3DDisplayGroupStateObjPtr    displayGroupState;    { 0-1 }
  198.  *==============================================================================
  199.  */
  200. #define    kMF3DObjIOProxyDisplayGroup                MF3DObjectType('i','o','p','x')
  201. #define    kMF3DObjIOProxyDisplayGroupText            "IOProxyDisplayGroup"
  202.  
  203. typedef    struct MF3DIOProxyDisplayGroupObj
  204. {    MF3DObjHeader
  205. } MF3DIOProxyDisplayGroupObj, *MF3DIOProxyDisplayGroupObjPtr;
  206.  
  207. /*==============================================================================
  208.  *    InfoGroup
  209.  *==============================================================================
  210.  */
  211. #define    kMF3DObjInfoGroup                        MF3DObjectType('i','n','f','o')
  212. #define    kMF3DObjInfoGroupText                    "InfoGroup"
  213.  
  214. typedef    struct MF3DInfoGroupObj
  215. {    MF3DObjHeader
  216. } MF3DInfoGroupObj, *MF3DInfoGroupObjPtr;
  217.  
  218. /*==============================================================================
  219.  *    LightGroup
  220.  *==============================================================================
  221.  */
  222. #define    kMF3DObjLightGroup                        MF3DObjectType('l','g','h','g')
  223. #define    kMF3DObjLightGroupText                    "LightGroup"
  224.  
  225. typedef    struct MF3DLightGroupObj
  226. {    MF3DObjHeader
  227. } MF3DLightGroupObj, *MF3DLightGroupObjPtr;
  228.  
  229. /*==============================================================================
  230.  *    EndGroup
  231.  *==============================================================================
  232.  */
  233. #define kMF3DObjEndGroup                        MF3DObjectType('e','n','d','g')
  234. #define    kMF3DObjEndGroupText                    "EndGroup"
  235.  
  236. typedef struct MF3DEndGroupObj
  237. {    MF3DObjHeader
  238. } MF3DEndGroupObj, *MF3DEndGroupObjPtr;
  239.  
  240. /*==============================================================================
  241.  *    Interactive Renderer
  242.  *==============================================================================
  243.  */
  244. #define kMF3DObjRendererInteractive                MF3DObjectType('c','t','w','n')
  245. #define    kMF3DObjRendererInteractiveText            "InteractiveRenderer"
  246.  
  247. typedef struct MF3DInteractiveRendererObj
  248. {    MF3DObjHeader
  249. } MF3DInteractiveRendererObj, *MF3DInteractiveRendererObjPtr;
  250.  
  251. /*==============================================================================
  252.  *    GenericRenderer (does nothing)
  253.  *==============================================================================
  254.  */
  255. #define    kMF3DObjRendererGeneric                    MF3DObjectType('g','n','r','r')
  256. #define    kMF3DObjRendererGenericText                "GenericRenderer"
  257.  
  258. typedef struct MF3DGenericRendererObj
  259. {    MF3DObjHeader
  260. } MF3DGenericRendererObj, *MF3DGenericRendererObjPtr;
  261.  
  262. /*==============================================================================
  263.  *    WireFrame Renderer
  264.  *==============================================================================
  265.  */
  266. #define    kMF3DObjRendererWireFrame                MF3DObjectType('w','r','f','r')
  267. #define    kMF3DObjRendererWireFrameText            "WireFrame"
  268.  
  269. typedef struct MF3DWireFrameObj
  270. {    MF3DObjHeader
  271. } MF3DWireFrameObj, *MF3DWireFrameObjPtr;
  272.  
  273. /*==============================================================================
  274.  *    ZBuffer Renderer
  275.  *==============================================================================
  276.  */
  277. #define    kMF3DObjRendererZBuffer                    MF3DObjectType('z','b','u','f')
  278. #define    kMF3DObjRendererZBufferText                "ZBuffer"
  279.  
  280. typedef struct MF3DZBufferObj
  281. {    MF3DObjHeader
  282. } MF3DZBufferObj, *MF3DZBufferObjPtr;
  283.  
  284. /*==============================================================================
  285.  *    OrthographicCamera
  286.  *
  287.  *    left < right
  288.  *    bottom < top
  289.  *
  290.  *    Optionally followed by:
  291.  *        MF3DCameraPlacementObjPtr    cameraPlacement;    { 0-1 }
  292.  *        MF3DCameraRangeObjPtr        cameraRange;        { 0-1 }
  293.  *        MF3DCameraViewPortObjPtr    cameraViewPort;        { 0-1 }
  294.  *==============================================================================
  295.  */
  296. #define    kMF3DObjOrthographicCamera                MF3DObjectType('o','r','t','h')
  297. #define    kMF3DObjOrthographicCameraText            "OrthographicCamera"
  298.  
  299. typedef struct MF3DOrthographicCameraObj
  300. {    MF3DObjHeader
  301.     MF3DFloat32                    left;
  302.     MF3DFloat32                    top;
  303.     MF3DFloat32                    right;
  304.     MF3DFloat32                    bottom;
  305. } MF3DOrthographicCameraObj, *MF3DOrthographicCameraObjPtr;
  306.  
  307. /*==============================================================================
  308.  *    ViewAngleAspectCamera
  309.  *
  310.  *    0 < fieldOfView <= pi
  311.  *    0 < aspectRatioXtoY
  312.   *
  313.  *    Optionally followed by:
  314.  *        MF3DCameraPlacementObjPtr    cameraPlacement;    { 0-1 }
  315.  *        MF3DCameraRangeObjPtr        cameraRange;        { 0-1 }
  316.  *        MF3DCameraViewPortObjPtr    cameraViewPort;        { 0-1 }
  317. *==============================================================================
  318.  */
  319. #define    kMF3DObjViewAngleAspectCamera            MF3DObjectType('v','a','n','a')
  320. #define    kMF3DObjViewAngleAspectCameraText        "ViewAngleAspectCamera"
  321.  
  322. typedef struct MF3DViewAngleAspectCameraObj
  323. {    MF3DObjHeader
  324.     MF3DFloat32                    fieldOfView;
  325.     MF3DFloat32                    aspectRatioXtoY;
  326. } MF3DViewAngleAspectCameraObj, *MF3DViewAngleAspectCameraObjPtr;
  327.  
  328. /*==============================================================================
  329.  *    ViewPlaneCamera
  330.  *
  331.  *    0 < viewPlane
  332.  *    0 < halfWidthAtViewPlane
  333.  *    0 < halfHeightAtViewPlane
  334.  *    centerXOnViewPlane, centerYOnViewPlane may be any value
  335.  *
  336.  *    Optionally followed by:
  337.  *        MF3DCameraPlacementObjPtr    cameraPlacement;    { 0-1 }
  338.  *        MF3DCameraRangeObjPtr        cameraRange;        { 0-1 }
  339.  *        MF3DCameraViewPortObjPtr    cameraViewPort;        { 0-1 }
  340.  *==============================================================================
  341.  */
  342. #define    kMF3DObjViewPlaneCamera                    MF3DObjectType('v','w','p','l')
  343. #define    kMF3DObjViewPlaneCameraText                "ViewPlaneCamera"
  344.  
  345. typedef struct MF3DViewPlaneCameraObj
  346. {    MF3DObjHeader
  347.     MF3DFloat32                    viewPlane;
  348.     MF3DFloat32                    halfWidthAtViewPlane;
  349.     MF3DFloat32                    halfHeightAtViewPlane;
  350.     MF3DFloat32                    centerXOnViewPlane;
  351.     MF3DFloat32                    centerYOnViewPlane;
  352. } MF3DViewPlaneCameraObj, *MF3DViewPlaneCameraObjPtr;
  353.  
  354. /*==============================================================================
  355.  *    Box
  356.  *
  357.  *    For 0-sized objects, default is:
  358.  *        1 0 0 # orientation
  359.  *        0 1 0 # majorAxis
  360.  *        0 0 1 # minorAxis
  361.  *        0 0 0 # origin
  362.  *
  363.  *    Optionally followed by:
  364.  *        MF3DFaceAttributeSetListObjPtr    faceAttributes;    { 0-1, nFaces = 6 }
  365.  *        MF3DAttributeSetListObjPtr        attributes;        { 0-1 }
  366.  *==============================================================================
  367.  */
  368. #define    kMF3DObjBox                                MF3DObjectType('b','o','x',' ')
  369. #define    kMF3DObjBoxText                            "Box"
  370.  
  371. typedef struct MF3DBoxData
  372. {    MF3DVector3D                orientation;
  373.     MF3DVector3D                majorAxis;
  374.     MF3DVector3D                minorAxis;
  375.     MF3DPoint3D                    origin;
  376. } MF3DBoxData, *MF3DBoxDataPtr;
  377.  
  378. typedef struct MF3DBoxObj
  379. {    MF3DObjHeader
  380.     MF3DBoxDataPtr                box;                /* (optional)            */
  381. } MF3DBoxObj, *MF3DBoxObjPtr;
  382.  
  383. /*==============================================================================
  384.  *    Cone
  385.  *
  386.  *    For 0-sized objects, default is:
  387.  *        1 0 0 # orientation
  388.  *        0 1 0 # majorAxis
  389.  *        0 0 1 # minorAxis
  390.  *        0 0 0 # origin
  391.  *
  392.  *    Optionally followed by:
  393.  *        MF3DCapsObjPtr                        caps;                    { 0-1 }
  394.  *        MF3DFaceCapAttributeSetObjPtr        faceCapAttributes;        { 0-1 }
  395.  *        MF3DBottomCapAttributeSetObjPtr        bottomCapAttributes;    { 0-1 }
  396.  *        MF3DAttributeSetListObjPtr            attributes;                { 0-1 }
  397.  *==============================================================================
  398.  */
  399. #define    kMF3DObjCone                            MF3DObjectType('c','o','n','e')
  400. #define    kMF3DObjConeText                        "Cone"
  401.  
  402. typedef struct MF3DConeData
  403. {    MF3DVector3D                orientation;
  404.     MF3DVector3D                majorAxis;
  405.     MF3DVector3D                minorAxis;
  406.     MF3DPoint3D                    origin;
  407. } MF3DConeData, *MF3DConeDataPtr;
  408.  
  409. typedef struct MF3DConeObj
  410. {    MF3DObjHeader
  411.     MF3DConeDataPtr                cone;                    /* (optional)        */
  412. } MF3DConeObj, *MF3DConeObjPtr;
  413.  
  414. /*==============================================================================
  415.  *    Cylinder
  416.  *
  417.  *    For 0-sized objects, default is:
  418.  *        1 0 0 # orientation
  419.  *        0 1 0 # majorAxis
  420.  *        0 0 1 # minorAxis
  421.  *        0 0 0 # origin
  422.  *
  423.  *    Optionally followed by:
  424.  *        MF3DCapsObjPtr                        caps;                    { 0-1 }
  425.  *        MF3DTopCapAttributeSetObjPtr        topCapAttributes;        { 0-1 }
  426.  *        MF3DFaceCapAttributeSetObjPtr        faceCapAttributes;        { 0-1 }
  427.  *        MF3DBottomCapAttributeSetObjPtr        bottomCapAttributes;    { 0-1 }
  428.  *        MF3DAttributeSetListObjPtr            attributes;                { 0-1 }
  429.  *==============================================================================
  430.  */
  431. #define    kMF3DObjCylinder                        MF3DObjectType('c','y','l','n')
  432. #define    kMF3DObjCylinderText                    "Cylinder"
  433.  
  434. typedef struct MF3DCylinderData
  435. {    MF3DVector3D                orientation;
  436.     MF3DVector3D                majorAxis;
  437.     MF3DVector3D                minorAxis;
  438.     MF3DPoint3D                    origin;
  439. } MF3DCylinderData, *MF3DCylinderDataPtr;
  440.  
  441. typedef struct MF3DCylinderObj
  442. {    MF3DObjHeader
  443.     MF3DCylinderDataPtr            cylinder;                /* (optional)        */
  444. } MF3DCylinderObj, *MF3DCylinderObjPtr;
  445.  
  446. /*==============================================================================
  447.  *    Disk
  448.  *
  449.  *    For 0-sized objects, default is:
  450.  *        1 0 0 # majorRadius
  451.  *        0 1 0 # minorRadius
  452.  *        0 0 0 # origin
  453.  *
  454.  *    Optionally followed by:
  455.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  456.  *==============================================================================
  457.  */
  458. #define    kMF3DObjDisk                            MF3DObjectType('d','i','s','k')
  459. #define    kMF3DObjDiskText                        "Disk"
  460.  
  461. typedef struct MF3DDiskData
  462. {    MF3DObjHeader
  463.     MF3DVector3D                majorRadius;
  464.     MF3DVector3D                minorRadius;
  465.     MF3DPoint3D                    origin;
  466. } MF3DDiskData, *MF3DDiskDataPtr;
  467.  
  468. typedef struct MF3DDiskObj
  469. {    MF3DObjHeader
  470.     MF3DDiskDataPtr                    disk;                /* (optional)        */
  471. } MF3DDiskObj, *MF3DDiskObjPtr;
  472.  
  473. /*==============================================================================
  474.  *    Ellipse
  475.  *
  476.  *    For 0-sized objects, default is:
  477.  *        1 0 0 # majorAxis
  478.  *        0 1 0 # minorAxis
  479.  *        0 0 0 # origin
  480.  *
  481.  *    Optionally followed by:
  482.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  483.  *==============================================================================
  484.  */
  485. #define    kMF3DObjEllipse                            MF3DObjectType('e','l','p','s')
  486. #define    kMF3DObjEllipseText                        "Ellipse"
  487.  
  488. typedef    struct MF3DEllipseData
  489. {    MF3DVector3D                majorAxis;
  490.     MF3DVector3D                minorAxis;
  491.     MF3DPoint3D                    origin;
  492. } MF3DEllipseData, *MF3DEllipseDataPtr;
  493.  
  494. typedef struct MF3DEllipseObj
  495. {    MF3DObjHeader
  496.     MF3DEllipseDataPtr            ellipse;                /* (optional)        */
  497. } MF3DEllipseObj, *MF3DEllipseObjPtr;
  498.  
  499. /*==============================================================================
  500.  *    Ellipsoid
  501.  *
  502.  *    For 0-sized objects, default is:
  503.  *        1 0 0 # orientation
  504.  *        0 1 0 # majorAxis
  505.  *        0 0 1 # minorAxis
  506.  *        0 0 0 # origin
  507.  *
  508.  *    Optionally followed by:
  509.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  510.  *==============================================================================
  511.  */
  512. #define    kMF3DObjEllipsoid                        MF3DObjectType('e','l','p','d')
  513. #define    kMF3DObjEllipsoidText                    "Ellipsoid"
  514.  
  515. typedef    struct MF3DEllipsoidData
  516. {    MF3DVector3D                orientation;
  517.     MF3DVector3D                majorRadius;
  518.     MF3DVector3D                minorRadius;
  519.     MF3DPoint3D                    origin;
  520. } MF3DEllipsoidData, *MF3DEllipsoidDataPtr;
  521.  
  522. typedef struct MF3DEllipsoidObj
  523. {    MF3DObjHeader
  524.     MF3DEllipsoidDataPtr        ellipsoid;                /* (optional)        */
  525. } MF3DEllipsoidObj, *MF3DEllipsoidObjPtr;
  526.  
  527. /*==============================================================================
  528.  *    GeneralPolygonHint
  529.  *==============================================================================
  530.  */
  531. #define    kMF3DObjGeneralPolygonHint                MF3DObjectType('g','p','l','h')
  532. #define    kMF3DObjGeneralPolygonHintText            "GeneralPolygonHint"
  533.  
  534. enum MF3DGeneralPolygonHintEnum
  535. {    MF3DShapeComplex        = 0x00000000,
  536.     MF3DShapeConcave        = 0x00000001,
  537.     MF3DShapeConvex            = 0x00000002,
  538.     MF3DShapeUnknown        = MF3DShapeComplex
  539. };
  540. typedef    MF3DEnumData    MF3DGeneralPolygonHintEnum;
  541.  
  542. typedef struct MF3DGeneralPolygonHintObj
  543. {    MF3DObjHeader
  544.     MF3DGeneralPolygonHintEnum    shapeHint;
  545. } MF3DGeneralPolygonHintObj, *MF3DGeneralPolygonHintObjPtr;
  546.  
  547. /*==============================================================================
  548.  *    GeneralPolygon
  549.  *
  550.  *    0 < nContours
  551.  *    2 < nVertices
  552.  *
  553.  *    Optionally followed by:
  554.  *        { nVertices = sum(nContours.nVertices }
  555.  *        MF3DVertexAttributeSetListObjPtr    vertexAttributes;    { 0-1 }
  556.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  557.  *        MF3DGeneralPolygonHintObjPtr        polygonHint;        { 0-1 }
  558.  *==============================================================================
  559.  */
  560. #define    kMF3DObjGeneralPolygon                    MF3DObjectType('g','p','g','n')
  561. #define    kMF3DObjGeneralPolygonText                "GeneralPolygon"
  562.  
  563. typedef struct MF3DPolygonData
  564. {    MF3DUns32                nVertices;
  565.     MF3DPoint3DPtr            vertices;            /* size: nVertices            */
  566. } MF3DPolygonData, *MF3DPolygonDataPtr;
  567.  
  568. typedef struct MF3DGeneralPolygonObj
  569. {    MF3DObjHeader
  570.     MF3DUns32                nContours;
  571.     MF3DPolygonDataPtr        polygons;            /* size: nContours            */
  572. } MF3DGeneralPolygonObj, *MF3DGeneralPolygonObjPtr;
  573.  
  574. /*==============================================================================
  575.  *    Line
  576.  *
  577.  *    Optionally followed by:
  578.  *        MF3DVertexAttributeSetListObjPtr    vertexAttributes;    { 0-1, nV = 2 }
  579.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  580.  *==============================================================================
  581.  */
  582. #define    kMF3DObjLine                            MF3DObjectType('l','i','n','e')
  583. #define    kMF3DObjLineText                        "Line"
  584.  
  585. typedef struct MF3DLineObj
  586. {    MF3DObjHeader
  587.     MF3DPoint3D                    start;
  588.     MF3DPoint3D                    end;
  589. } MF3DLineObj, *MF3DLineObjPtr;
  590.  
  591. /*==============================================================================
  592.  *    Marker
  593.  *
  594.  *    0 < width
  595.  *    0 < height
  596.  *    (((width / 8) + ((width & 7) > 0)) Û rowBytes
  597.  *
  598.  *    Optionally followed by:
  599.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  600.  *==============================================================================
  601.  */
  602. #define    kMF3DObjMarker                            MF3DObjectType('m','r','k','r')
  603. #define    kMF3DObjMarkerText                        "Marker"
  604.  
  605. typedef struct MF3DMarkerObj
  606. {    MF3DObjHeader
  607.     MF3DPoint3D                    location;
  608.     MF3DUns32                    width;
  609.     MF3DUns32                    height;
  610.     MF3DUns32                    rowBytes;
  611.     MF3DInt32                    xOffset;
  612.     MF3DInt32                    yOffset;
  613.     MF3DRawDataPtr                data;                /* size: height*rowBytes */
  614. } MF3DMarkerObj, *MF3DMarkerObjPtr;
  615.  
  616. /*==============================================================================
  617.  *    Mesh
  618.  *
  619.  *    3 <= nVertices
  620.  *    3 <= nFaceVertexIndices
  621.  *
  622.  *    Optionally followed by:
  623.  *        MF3DFaceAttributeSetListObjPtr     faceAttributes;    { 0-1, nFaces }
  624.  *        MF3DVertexAttributeSetListObjPtr vertexAttributes;    { 0-1, nVertices }
  625.  *        MF3DMeshCornersObjPtr             meshCorners;        { 0-1 }
  626.  *        MF3DMeshEdgesObjPtr                 meshEdges;            { 0-1 }
  627.  *        MF3DAttributeSetListObjPtr         attributes;        { 0-1 }
  628.  *==============================================================================
  629.  */
  630. #define    kMF3DObjMesh                            MF3DObjectType('m','e','s','h')
  631. #define    kMF3DObjMeshText                        "Mesh"
  632.  
  633. typedef struct MF3DMeshFace
  634. {    MF3DUns32        nFaceVertexIndices;
  635.     MF3DUns32Ptr    faceVertexIndices;            /* size: nFaceVertexIndices    */
  636. } MF3DMeshFace, *MF3DMeshFacePtr;
  637.  
  638. typedef struct MF3DMeshObj
  639. {    MF3DObjHeader
  640.     MF3DUns32                nVertices;
  641.     MF3DPoint3DPtr            vertices;            /* size: nVertices            */
  642.     MF3DUns32                nFaces;
  643.     MF3DUns32                nContours;
  644.     MF3DMeshFacePtr            faces;                /* size: nFaces + nContours    */
  645. } MF3DMeshObj, *MF3DMeshObjPtr;
  646.  
  647. /*==============================================================================
  648.  *    NURBCurve
  649.  *
  650.  *    2 <= order
  651.  *    2 <= nPoints
  652.  *    0 < points[...].w (weights of points)
  653.  *==============================================================================
  654.  */
  655. #define    kMF3DObjNURBCurve                        MF3DObjectType('n','r','b','c')
  656. #define    kMF3DObjNURBCurveText                    "NURBCurve"
  657.  
  658. typedef    MF3DFloat32    MF3DKnot, *MF3DKnotPtr;
  659.  
  660. typedef struct MF3DNURBCurveObj
  661. {    MF3DObjHeader
  662.     MF3DUns32                order;
  663.     MF3DUns32                nPoints;
  664.     MF3DRationalPoint4DPtr    points;                /* size: nPoints            */
  665.     MF3DKnotPtr                knots;                /* size: order + nPoints    */
  666. } MF3DNURBCurveObj, *MF3DNURBCurveObjPtr;
  667.  
  668. /*==============================================================================
  669.  *    NURBCurve2D
  670.  *
  671.  *    2 Û order
  672.  *    2 Û nPoints
  673.  *    0 < points[...].w (weights of points)
  674.  *==============================================================================
  675.  */
  676. #define    kMF3DObjNURBCurve2D                        MF3DObjectType('n','b','2','c')
  677. #define    kMF3DObjNURBCurve2DText                    "NURBCurve2D"
  678.  
  679. typedef struct MF3DNURBCurve2DObj
  680. {    MF3DObjHeader
  681.     MF3DUns32                order;
  682.     MF3DUns32                nPoints;
  683.     MF3DRationalPoint3DPtr    points;                /* size: nPoints            */
  684.     MF3DKnotPtr                knots;                /* size: order + nPoints    */
  685. } MF3DNURBCurve2DObj, *MF3DNURBCurve2DObjPtr;
  686.  
  687. /*==============================================================================
  688.  *    NurbPatch
  689.  *
  690.  *    2 <= uOrder
  691.  *    2 <= vOrder
  692.  *    2 <= numColumns
  693.  *    2 <= numRows
  694.  *    0 < points[...].w (weights of points)
  695.  *
  696.  *    Optionally followed by:
  697.  *        MF3DTrimCurvesObjPtr    trimCurves;        { 0-1, nTrimCurves = 1 to many }
  698.  *==============================================================================
  699.  */
  700. #define    kMF3DObjNURBPatch                        MF3DObjectType('n','r','b','p')
  701. #define    kMF3DObjNURBPatchText                    "NURBPatch"
  702.  
  703. typedef    struct MF3DNurbPatchObj
  704. {    MF3DObjHeader
  705.     MF3DUns32                uOrder;
  706.     MF3DUns32                vOrder;
  707.     MF3DUns32                numColumns;
  708.     MF3DUns32                numRows;
  709.     MF3DRationalPoint4DPtr    points;                /* size: numColumns*numRows    */
  710.     MF3DKnotPtr                uKnots;                /* size: uOrder + numColumn    */
  711.     MF3DKnotPtr                vKnots;                /* size: vOrder + numRows    */
  712. } MF3DNurbPatchObj, *MF3DNurbPatchObjPtr;
  713.  
  714. /*==============================================================================
  715.  *    Point
  716.  *
  717.  *    Optionally followed by:
  718.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  719.  *==============================================================================
  720.  */
  721. #define    kMF3DObjPoint                            MF3DObjectType('p','n','t',' ')
  722. #define    kMF3DObjPointText                        "Point"
  723.  
  724. typedef    struct MF3DPointObj
  725. {    MF3DObjHeader
  726.     MF3DPoint3D                point;
  727. } MF3DPointObj, *MF3DPointObjPtr;
  728.  
  729. /*==============================================================================
  730.  *    Polygon
  731.  *
  732.  *    2 <= nVertices
  733.  *
  734.  *    Optionally followed by:
  735.  *        MF3DVertexAttributeSetListObjPtr vertexAttributes;    { 0-1, nVertices }
  736.  *        MF3DAttributeSetListObjPtr         attributes;        { 0-1 }
  737.  *==============================================================================
  738.  */
  739. #define    kMF3DObjPolygon                            MF3DObjectType('p','l','y','g')
  740. #define    kMF3DObjPolygonText                        "Polygon"
  741.  
  742. typedef    struct MF3DPolygonObj
  743. {    MF3DObjHeader
  744.     MF3DUns32                nVertices;
  745.     MF3DPoint3DPtr            vertices;            /* size: nVertices    */
  746. } MF3DPolygonObj, *MF3DPolygonObjPtr;
  747.  
  748. /*==============================================================================
  749.  *    PolyLine
  750.  *
  751.  *    2 <= nVertices
  752.  *
  753.  *    Optionally followed by:
  754.  *        { nVertices }
  755.  *        MF3DVertexAttributeSetListObjPtr    vertexAttributes;    { 0-1 }
  756.  *        { nGeometries = nVertices - 1 }
  757.  *        MF3DGeometryAttributeSetListObjPtr    geometryAttributes;    { 0-1 }
  758.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  759.  *==============================================================================
  760.  */
  761. #define    kMF3DObjPolyLine                        MF3DObjectType('p','l','y','l')
  762. #define    kMF3DObjPolyLineText                    "PolyLine"
  763.  
  764. typedef    struct MF3DPolyLineObj
  765. {    MF3DObjHeader
  766.     MF3DUns32                nVertices;
  767.     MF3DPoint3DPtr            vertices;            /* size: nVertices    */
  768. } MF3DPolyLineObj, *MF3DPolyLineObjPtr;
  769.  
  770. /*==============================================================================
  771.  *    Torus
  772.  *
  773.  *    For 0-sized objects, default is:
  774.  *
  775.  *    1 0 0 # orientation
  776.  *    0 1 0 # majorAxis
  777.  *    0 0 1 # minorAxis
  778.  *    0 0 0 # origin
  779.  *    1     # ratio
  780.  *
  781.  *    Optionally followed by:
  782.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  783.  *==============================================================================
  784.  */
  785. #define    kMF3DObjTorus                            MF3DObjectType('t','o','r','s')
  786. #define    kMF3DObjTorusText                        "Torus"
  787.  
  788. typedef    struct MF3DTorusData
  789. {    MF3DVector3D            orientation;
  790.     MF3DVector3D            majorAxis;
  791.     MF3DVector3D            minorAxis;
  792.     MF3DPoint3D                origin;
  793.     MF3DFloat32                ratio;
  794. } MF3DTorusData, *MF3DTorusDataPtr;
  795.  
  796. typedef    struct MF3DTorusObj
  797. {    MF3DObjHeader
  798.     MF3DTorusDataPtr        torus;                /* (optional)                */
  799. } MF3DTorusObj, *MF3DTorusObjPtr;
  800.  
  801. /*==============================================================================
  802.  *    Triangle
  803.  *
  804.  *    Optionally followed by:
  805.  *        MF3DVertexAttributeSetListObjPtr    vertexAttributes;    { 0-1, n = 3 }
  806.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  807.  *==============================================================================
  808.  */
  809. #define    kMF3DObjTriangle                        MF3DObjectType('t','r','n','g')
  810. #define    kMF3DObjTriangleText                    "Triangle"
  811.  
  812. typedef    struct MF3DTriangleObj
  813. {    MF3DObjHeader
  814.     MF3DPoint3D                vertex1;
  815.     MF3DPoint3D                vertex2;
  816.     MF3DPoint3D                vertex3;
  817. } MF3DTriangleObj, *MF3DTriangleObjPtr;
  818.  
  819. /*==============================================================================
  820.  *    TriGrid
  821.  *
  822.  *    2 Ú numRows
  823.  *    2 Ú numColumns
  824.  *
  825.  *    vertices are specified in row-major order. For example:
  826.  *
  827.  *    numRows = 2, numColumns = 4
  828.  *
  829.  *        col0 col1 col2 col3
  830.  *    row0   p1   p2   p3   p4
  831.  *  row1   p5   p6   p7   p8
  832.  *
  833.  *    In the metafile, vertices are specified
  834.  *    p1 p2 p3 p4 p5 p6 p7 p8
  835.  *
  836.  *    Optionally followed by:
  837.  *        { nFaces = (numRows - 1) * (numColumns - 1) * 2 }
  838.  *        MF3DFaceAttributeSetListObjPtr        faceAttributes;        { 0-1 }
  839.  *        { nVertices = numRows * numColumns }
  840.  *        MF3DVertexAttributeSetListObjPtr    vertexAttributes;    { 0-1 }
  841.  *        MF3DAttributeSetListObjPtr            attributes;            { 0-1 }
  842.  *==============================================================================
  843.  */
  844. #define    kMF3DObjTriGrid                            MF3DObjectType('t','r','i','g')
  845. #define    kMF3DObjTriGridText                        "TriGrid"
  846.  
  847. typedef    struct MF3DTriGridObj
  848. {    MF3DObjHeader
  849.     MF3DUns32                numRows;
  850.     MF3DUns32                numColumns;
  851.     MF3DPoint3DPtr            vertices;            /* size: numColumns * numRows */
  852. } MF3DTriGridObj, *MF3DTriGridObjPtr;
  853.  
  854. /*==============================================================================
  855.  *    LightData
  856.  *
  857.  *    0 Û intensity Û 1
  858.  *==============================================================================
  859.  */
  860. #define    kMF3DObjLightData                        MF3DObjectType('l','g','h','t')
  861. #define    kMF3DObjLightDataText                    "LightData"
  862.  
  863. #define    MF3DLightDataIsOnDefault        true
  864. #define    MF3DLightDataIntensityDefault    1.0
  865. #define    MF3DLightDataColorDefault        { 1, 1, 1 }
  866.  
  867. typedef struct MF3DLightDataObj
  868. {    MF3DObjHeader
  869.     MF3DBoolean            isOn;
  870.     MF3DFloat32            intensity;                    /* 0 <= intensity <= 1    */
  871.     MF3DRGBColor        color;
  872. } MF3DLightDataObj, *MF3DLightDataObjPtr;
  873.  
  874. /*==============================================================================
  875.  *    AmbientLight
  876.  *
  877.  *    Optionally followed by:
  878.  *        MF3DLightDataObjPtr        lightData;            { 0-1 }
  879.  *==============================================================================
  880.  */
  881. #define    kMF3DObjAmbientLight                    MF3DObjectType('a','m','b','n')
  882. #define    kMF3DObjAmbientLightText                "AmbientLight"
  883.  
  884. typedef    struct MF3DAmbientLightObj
  885. {    MF3DObjHeader
  886. } MF3DAmbientLightObj, *MF3DAmbientLightObjPtr;
  887.  
  888. /*==============================================================================
  889.  *    DirectionalLight
  890.  *
  891.  *    |direction| = 1.0
  892.  *
  893.  *    Optionally followed by:
  894.  *        MF3DLightDataObjPtr        lightData;            { 0-1 }
  895.  *==============================================================================
  896.  */
  897. #define    kMF3DObjDirectionalLight                MF3DObjectType('d','r','c','t')
  898. #define    kMF3DObjDirectionalLightText            "DirectionalLight"
  899.  
  900. typedef    struct MF3DDirectionalLightObj
  901. {    MF3DObjHeader
  902.     MF3DVector3D            direction;
  903.     MF3DBoolean                castsShadows;
  904. } MF3DDirectionalLightObj, *MF3DDirectionalLightObjPtr;
  905.  
  906. /*==============================================================================
  907.  *    PointLight
  908.  *
  909.  *    attenuation = 1/(c0 + c1*d + c2 + d^2), d is the distance from location
  910.  *    0 < c0, c1,c2
  911.  *    attenuation is not clamped to [0,1] to allow for lighting washout
  912.  *
  913.  *    Optionally followed by:
  914.  *        MF3DLightDataObjPtr        lightData;            { 0-1 }
  915.  *==============================================================================
  916.  */
  917. #define    kMF3DObjPointLight                        MF3DObjectType('p','n','t','l')
  918. #define    kMF3DObjPointLightText                    "PointLight"
  919.  
  920. typedef    struct MF3DAttenuation
  921. {    MF3DFloat32                c0;
  922.     MF3DFloat32                c1;
  923.     MF3DFloat32                c2;
  924. } MF3DAttenuation;
  925.  
  926. typedef    struct MF3DPointLightObj
  927. {    MF3DObjHeader
  928.     MF3DPoint3D                location;
  929.     MF3DAttenuation            attenuation;
  930.     MF3DBoolean                castsShadows;
  931. } MF3DPointLightObj, *MF3DPointLightObjPtr;
  932.  
  933. /*==============================================================================
  934.  *    SpotLight
  935.  *
  936.  *    |orientation| = 1
  937.  *    0 < hotAngle <= outerAngle <= pi
  938.  *==============================================================================
  939.  */
  940. #define    kMF3DObjSpotLight                        MF3DObjectType('s','p','o','t')
  941. #define    kMF3DObjSpotLightText                    "SpotLight"
  942.  
  943. enum MF3DFallOffEnum
  944. {    MF3DFallOffNone            = 0x00000000,
  945.     MF3DFallOffLinear        = 0x00000001,
  946.     MF3DFallOffExponential    = 0x00000002,
  947.     MF3DFallOffCosine        = 0x00000003
  948. };
  949. typedef    MF3DEnumData    MF3DFallOffEnum;
  950.  
  951. typedef    struct MF3DSpotLightObj
  952. {    MF3DObjHeader
  953.     MF3DPoint3D                location;
  954.     MF3DVector3D            orientation;
  955.     MF3DBoolean                castsShadows;
  956.     MF3DAttenuation            attenuation;
  957.     MF3DFloat32                hotAngle;
  958.     MF3DFloat32                outerAngle;
  959.     MF3DFallOffEnum            fallOff;
  960. } MF3DSpotLightObj, *MF3DSpotLightObjPtr;
  961.  
  962. /*==============================================================================
  963.  *    LambertIllumination
  964.  *==============================================================================
  965.  */
  966. #define    kMF3DObjLambertIllumination                MF3DObjectType('l','m','i','l')
  967. #define    kMF3DObjLambertIlluminationText            "LambertIllumination"
  968.  
  969. typedef    struct MF3DLambertIlluminationObj
  970. {    MF3DObjHeader
  971. } MF3DLambertIlluminationObj, *MF3DLambertIlluminationObjPtr;
  972.  
  973. /*==============================================================================
  974.  *    PhongIllumination
  975.  *==============================================================================
  976.  */
  977. #define    kMF3DObjPhongIllumination                MF3DObjectType('p','h','i','l')
  978. #define    kMF3DObjPhongIlluminationText            "PhongIllumination"
  979.  
  980. typedef    struct MF3DPhongIlluminationObj
  981. {    MF3DObjHeader
  982. } MF3DPhongIlluminationObj, *MF3DPhongIlluminationObjPtr;
  983.  
  984. /*==============================================================================
  985.  *    PixmapTexture
  986.  *
  987.  *    0 < width
  988.  *    0 < height
  989.  *    0 < pixelSize < 32
  990.  *    width * pixelSize Û rowBytes
  991.  *==============================================================================
  992.  */
  993. #define    kMF3DObjPixmapTexture                    MF3DObjectType('t','x','p','m')
  994. #define    kMF3DObjPixmapTextureText                "PixmapTexture"
  995.  
  996. enum MF3DPixelTypeEnum
  997. {    MF3DPixelRGB8            = 0x00000000,
  998.     MF3DPixelRGB16            = 0x00000001,
  999.     MF3DPixelRGB24            = 0x00000002,
  1000.     MF3DPixelRGB32            = 0x00000003
  1001. };
  1002. typedef    MF3DEnumData    MF3DPixelTypeEnum;
  1003.  
  1004. enum MF3DEndianEnum
  1005. {    MF3DEndianBigEndian        = 0x00000000,
  1006.     MF3DEndianLittleEndian    = 0x00000001
  1007. };
  1008. typedef    MF3DEnumData    MF3DEndianEnum;
  1009.  
  1010. typedef    struct MF3DPixmapTextureObj
  1011. {    MF3DObjHeader
  1012.     MF3DUns32                width;
  1013.     MF3DUns32                height;
  1014.     MF3DUns32                rowBytes;
  1015.     MF3DUns32                pixelSize;
  1016.     MF3DPixelTypeEnum        pixelType;
  1017.     MF3DEndianEnum            bitOrder;
  1018.     MF3DEndianEnum            byteOrder;
  1019.     MF3DRawDataPtr            image;                /* size: rowBytes * height*/
  1020. } MF3DPixmapTextureObj, *MF3DPixmapTextureObjPtr;
  1021.  
  1022. /*==============================================================================
  1023.  *    TextureShader
  1024.  *
  1025.  *    Always followed by:
  1026.  *        MF3DPixmapTextureObjPtr    pixmapTexture;        { 1 }
  1027.  *==============================================================================
  1028.  */
  1029. #define    kMF3DObjTextureShader                    MF3DObjectType('t','x','s','u')
  1030. #define    kMF3DObjTextureShaderText                "TextureShader"
  1031.  
  1032. typedef    struct MF3DTextureShaderObj
  1033. {    MF3DObjHeader
  1034. } MF3DTextureShaderObj, *MF3DTextureShaderObjPtr;
  1035.  
  1036. /*==============================================================================
  1037.  *    BackfacingStyle
  1038.  *==============================================================================
  1039.  */
  1040. #define    kMF3DObjBackfacingStyle                    MF3DObjectType('b','c','k','f')
  1041. #define    kMF3DObjBackfacingStyleText                "BackfacingStyle"
  1042.  
  1043. enum MF3DBackfacingEnum
  1044. {    MF3DBackfacingBoth        = 0x00000000,
  1045.     MF3DBackfacingCulled    = 0x00000001,
  1046.     MF3DBackfacingFlipped    = 0x00000002
  1047. };
  1048. typedef    MF3DEnumData    MF3DBackfacingEnum;
  1049.  
  1050. typedef    struct MF3DBackfacingStyleObj
  1051. {    MF3DObjHeader
  1052.     MF3DBackfacingEnum        backfacing;
  1053. } MF3DBackfacingStyleObj, *MF3DBackfacingStyleObjPtr;
  1054.  
  1055. /*==============================================================================
  1056.  *    FillStyle
  1057.  *==============================================================================
  1058.  */
  1059. #define    kMF3DObjFillStyle                        MF3DObjectType('f','i','s','t')
  1060. #define    kMF3DObjFillStyleText                    "FillStyle"
  1061.  
  1062. enum MF3DFillStyleEnum
  1063. {    MF3DFillStyleFilled        = 0x00000000,
  1064.     MF3DFillStyleEdges        = 0x00000001,
  1065.     MF3DFillStylePoints        = 0x00000002,
  1066.     MF3DFillStyleEmpty        = 0x00000003
  1067. };
  1068. typedef    MF3DEnumData    MF3DFillStyleEnum;
  1069.  
  1070. typedef    struct MF3DFillStyleObj
  1071. {    MF3DObjHeader
  1072.     MF3DFillStyleEnum        fillStyle;
  1073. } MF3DFillStyleObj, *MF3DFillStyleObjPtr;
  1074.  
  1075. /*==============================================================================
  1076.  *    HighlightStyle
  1077.  *
  1078.  *    Always followed by:
  1079.  *        MF3DAttributeSetListObjPtr            attributes;            { 1 }
  1080.  *==============================================================================
  1081.  */
  1082. #define    kMF3DObjHighlightStyle                    MF3DObjectType('h','i','g','h')
  1083. #define    kMF3DObjHighlightStyleText                "HighlightStyle"
  1084.  
  1085. typedef    struct MF3DHighlightStyleObj
  1086. {    MF3DObjHeader
  1087. } MF3DHighlightStyleObj, *MF3DHighlightStyleObjPtr;
  1088.  
  1089. /*==============================================================================
  1090.  *    InterpolationStyle
  1091.  *==============================================================================
  1092.  */
  1093. #define    kMF3DObjInterpolationStyle                MF3DObjectType('i','n','t','p')
  1094. #define    kMF3DObjInterpolationStyleText            "InterpolationStyle"
  1095.  
  1096. enum MF3DInterpolationStyleEnum
  1097. {    MF3DInterpolationStyleNone        = 0x00000000,
  1098.     MF3DInterpolationStyleVertex    = 0x00000001,
  1099.     MF3DInterpolationStylePixel        = 0x00000002
  1100. };
  1101. typedef    MF3DEnumData    MF3DInterpolationStyleEnum;
  1102.  
  1103. typedef    struct MF3DInterpolationStyleObj
  1104. {    MF3DObjHeader
  1105.     MF3DInterpolationStyleEnum    interpolationStyle;
  1106. } MF3DInterpolationStyleObj, *MF3DInterpolationStyleObjPtr;
  1107.  
  1108. /*==============================================================================
  1109.  *    OrientationStyle
  1110.  *==============================================================================
  1111.  */
  1112. #define    kMF3DObjOrientationStyle                MF3DObjectType('o','r','n','t')
  1113. #define    kMF3DObjOrientationStyleText            "OrientationStyle"
  1114.  
  1115. enum MF3DOrientationStyleEnum
  1116. {    MF3DOrientationCCW        = 0x00000000,
  1117.     MF3DOrientationCW        = 0x00000001
  1118. };
  1119. typedef    MF3DEnumData    MF3DOrientationStyleEnum;
  1120.  
  1121. typedef    struct MF3DOrientationStyleObj
  1122. {    MF3DObjHeader
  1123.     MF3DOrientationStyleEnum    orientationStyle;
  1124. } MF3DOrientationStyleObj, *MF3DOrientationStyleObjPtr;
  1125.  
  1126. /*==============================================================================
  1127.  *    PickIDStyle
  1128.  *==============================================================================
  1129.  */
  1130. #define    kMF3DObjPickIDStyle                        MF3DObjectType('p','k','i','d')
  1131. #define    kMF3DObjPickIDStyleText                    "PickIDStyle"
  1132.  
  1133. typedef    struct MF3DPickIDStyleObj
  1134. {    MF3DObjHeader
  1135.     MF3DUns32                id;
  1136. } MF3DPickIDStyleObj, *MF3DPickIDStyleObjPtr;
  1137.  
  1138. /*==============================================================================
  1139.  *    PickPartsStyle
  1140.  *==============================================================================
  1141.  */
  1142. #define    kMF3DObjPickPartsStyle                    MF3DObjectType('p','k','p','t')
  1143. #define    kMF3DObjPickPartsStyleText                "PickPartsStyle"
  1144.  
  1145. enum MF3DPickPartsFlags
  1146. {    MF3DPickPartsObject        = 0x00000000,
  1147.     MF3DPickPartsFace        = 0x00000001,
  1148.     MF3DPickPartsEdge        = 0x00000002,
  1149.     MF3DPickPartsVertex        = 0x00000004,
  1150.     MF3DPickPartsDefault    = MF3DPickPartsObject
  1151. };
  1152. typedef    MF3DFlagData    MF3DPickPartsFlags;
  1153.     
  1154. typedef    struct MF3DPickPartsStyleObj
  1155. {    MF3DObjHeader
  1156.     MF3DPickPartsFlags        pickParts;
  1157. } MF3DPickPartsStyleObj, *MF3DPickPartsStyleObjPtr;
  1158.  
  1159. /*==============================================================================
  1160.  *    ReceiveShadowsStyle
  1161.  *==============================================================================
  1162.  */
  1163. #define    kMF3DObjReceiveShadowsStyle                MF3DObjectType('r','c','s','h')
  1164. #define    kMF3DObjReceiveShadowsStyleText            "ReceiveShadowsStyle"
  1165.  
  1166. typedef    struct MF3DReceiveShadowsStyleObj
  1167. {    MF3DObjHeader
  1168.     MF3DBoolean                receiveShadows;
  1169. } MF3DReceiveShadowsStyleObj, *MF3DReceiveShadowsStyleObjPtr;
  1170.  
  1171. /*==============================================================================
  1172.  *    SubdivisionStyle
  1173.  *==============================================================================
  1174.  */
  1175. #define    kMF3DObjSubdivisionStyle                MF3DObjectType('s','b','d','v')
  1176. #define    kMF3DObjSubdivisionStyleText            "SubdivisionStyle"
  1177.  
  1178. enum MF3DSubdivisionMethodEnum
  1179. {    MF3DSubdivisionConstant        = 0x00000000,
  1180.     MF3DSubdivisionWorldSpace    = 0x00000001,
  1181.     MF3DSubdivisionScreenSpace    = 0x00000002
  1182. };
  1183. typedef    MF3DEnumData    MF3DSubdivisionMethodEnum;
  1184.  
  1185. typedef struct MF3DSubdivisionConstantData
  1186. {    MF3DUns32                value1;
  1187.     MF3DUns32                value2;
  1188. } MF3DSubdivisionConstantData;
  1189.  
  1190. typedef struct MF3DSubdivisionSpaceData
  1191. {    MF3DFloat32                value1;
  1192. } MF3DSubdivisionSpaceData;
  1193.  
  1194. typedef union
  1195. {    MF3DSubdivisionConstantData    constant;
  1196.     MF3DSubdivisionSpaceData    space;
  1197. } MF3DSubdivisionData;
  1198.  
  1199. typedef    struct MF3DSubdivisionStyleObj
  1200. {    MF3DObjHeader
  1201.     MF3DSubdivisionMethodEnum    subdivisionMethod;
  1202.     MF3DSubdivisionData            subdivisionData;
  1203. } MF3DSubdivisionStyleObj, *MF3DSubdivisionStyleObjPtr;
  1204.  
  1205. /*==============================================================================
  1206.  *    Matrix
  1207.  *
  1208.  *    matrix is invertible
  1209.  *==============================================================================
  1210.  */
  1211. #define    kMF3DObjMatrixTransform                    MF3DObjectType('m','t','r','x')
  1212. #define    kMF3DObjMatrixTransformText                "Matrix"
  1213.  
  1214. typedef    struct MF3DMatrixObj
  1215. {    MF3DObjHeader
  1216.     MF3DMatrix4x4            matrix;
  1217. } MF3DMatrixObj, *MF3DMatrixObjPtr;
  1218.  
  1219. /*==============================================================================
  1220.  *    Quaternion
  1221.  *==============================================================================
  1222.  */
  1223. #define    kMF3DObjQuaternionTransform                MF3DObjectType('q','t','r','n')
  1224. #define    kMF3DObjQuaternionTransformText            "Quaternion"
  1225.  
  1226. typedef    struct MF3DQuaternion
  1227. {    MF3DFloat32                w;
  1228.     MF3DFloat32                x;
  1229.     MF3DFloat32                y;
  1230.     MF3DFloat32                z;
  1231. } MF3DQuaternion;
  1232.  
  1233. typedef    struct MF3DQuaternionObj
  1234. {    MF3DObjHeader
  1235.     MF3DQuaternion            quaternion;
  1236. } MF3DQuaternionObj, *MF3DQuaternionObjPtr;
  1237.  
  1238. /*==============================================================================
  1239.  *    Rotate
  1240.  *==============================================================================
  1241.  */
  1242. #define    kMF3DObjRotateTransform                    MF3DObjectType('r','o','t','t')
  1243. #define    kMF3DObjRotateTransformText                "Rotate"
  1244.  
  1245. enum MF3DAxisEnum
  1246. {    MF3DAxisX                = 0x00000000,
  1247.     MF3DAxisY                = 0x00000001,
  1248.     MF3DAxisZ                = 0x00000002
  1249. };
  1250. typedef    MF3DEnumData    MF3DAxisEnum;
  1251.  
  1252. typedef    struct MF3DRotateObj
  1253. {    MF3DObjHeader
  1254.     MF3DAxisEnum            axis;
  1255.     MF3DFloat32                radians;
  1256. } MF3DRotateObj, *MF3DRotateObjPtr;
  1257.  
  1258. /*==============================================================================
  1259.  *    RotateAboutAxis
  1260.  *
  1261.  *    |orientation| = 1
  1262.  *==============================================================================
  1263.  */
  1264. #define    kMF3DObjRotateAboutAxisTransform        MF3DObjectType('r','t','a','a')
  1265. #define    kMF3DObjRotateAboutAxisTransformText    "RotateAboutAxis"
  1266.  
  1267. typedef    struct MF3DRotateAboutAxisObj
  1268. {    MF3DObjHeader
  1269.     MF3DPoint3D                origin;
  1270.     MF3DVector3D            orientation;
  1271.     MF3DFloat32                radians;
  1272. } MF3DRotateAboutAxisObj, *MF3DRotateAboutAxisObjPtr;
  1273.  
  1274. /*==============================================================================
  1275.  *    RotateAboutPoint
  1276.  *==============================================================================
  1277.  */
  1278. #define    kMF3DObjRotateAboutPointTransform        MF3DObjectType('r','t','a','p')
  1279. #define    kMF3DObjRotateAboutPointTransformText    "RotateAboutPoint"
  1280.  
  1281. typedef    struct MF3DRotateAboutPointObj
  1282. {    MF3DObjHeader
  1283.     MF3DAxisEnum            axis;
  1284.     MF3DFloat32                radians;
  1285.     MF3DPoint3D                origin;
  1286. } MF3DRotateAboutPointObj, *MF3DRotateAboutPointObjPtr;
  1287.  
  1288. /*==============================================================================
  1289.  *    Scale
  1290.  *==============================================================================
  1291.  */
  1292. #define    kMF3DObjScaleTransform                    MF3DObjectType('s','c','a','l')
  1293. #define    kMF3DObjScaleTransformText                "Scale"
  1294.  
  1295. typedef    struct MF3DScaleObj
  1296. {    MF3DObjHeader
  1297.     MF3DVector3D            scale;
  1298. } MF3DScaleObj, *MF3DScaleObjPtr;
  1299.  
  1300. /*==============================================================================
  1301.  *    Translate
  1302.  *==============================================================================
  1303.  */
  1304. #define    kMF3DObjTranslateTransform                MF3DObjectType('t','r','n','s')
  1305. #define    kMF3DObjTranslateTransformText            "Translate"
  1306.  
  1307. typedef    struct MF3DTranslateObj
  1308. {    MF3DObjHeader
  1309.     MF3DVector3D            translate;
  1310. } MF3DTranslateObj, *MF3DTranslateObjPtr;
  1311.  
  1312. /*==============================================================================
  1313.  *    MacintoshPath
  1314.  *==============================================================================
  1315.  */
  1316. #define    kMF3DObjMacintoshPath                    MF3DObjectType('a','l','i','s')
  1317. #define    kMF3DObjMacintoshPathText                "MacintoshPath"
  1318.  
  1319. typedef    struct MF3DMacintoshPathObj
  1320. {    MF3DObjHeader
  1321.     MF3DCStringPtr            pathName;
  1322. } MF3DMacintoshPathObj, *MF3DMacintoshPathObjPtr;
  1323.  
  1324. /*==============================================================================
  1325.  *    UnixPath
  1326.  *==============================================================================
  1327.  */
  1328. #define    kMF3DObjUnixPath                        MF3DObjectType('u','n','i','x')
  1329. #define    kMF3DObjUnixPathText                    "UnixPath"
  1330.  
  1331. typedef    struct MF3DUnixPathObj
  1332. {    MF3DObjHeader
  1333.     MF3DCStringPtr            pathName;
  1334. } MF3DUnixPathObj, *MF3DUnixPathObjPtr;
  1335.  
  1336. /*==============================================================================
  1337.  *    CString
  1338.  *==============================================================================
  1339.  */
  1340. #define    kMF3DObjCString                            MF3DObjectType('s','t','r','c')
  1341. #define    kMF3DObjCStringText                        "CString"
  1342.  
  1343. typedef    struct MF3DCStringObj
  1344. {    MF3DObjHeader
  1345.     MF3DCStringPtr            cString;
  1346. } MF3DCStringObj, *MF3DCStringObjPtr;
  1347.  
  1348. /*==============================================================================
  1349.  *    Unicode
  1350.  *==============================================================================
  1351.  */
  1352. #define    kMF3DObjUnicode                            MF3DObjectType('u','n','c','d')
  1353. #define    kMF3DObjUnicodeText                        "Unicode"
  1354.  
  1355. typedef    struct MF3DUnicodeObj
  1356. {    MF3DObjHeader
  1357.     MF3DUns32                length;
  1358.     MF3DRawDataPtr            unicode;            /* size: length * 2    */
  1359. } MF3DUnicodeObj, *MF3DUnicodeObjPtr;
  1360.  
  1361. /*==============================================================================
  1362.  *    ImageDimensions
  1363.  *
  1364.  *    0 < width
  1365.  *    0 < height
  1366.  *==============================================================================
  1367.  */
  1368. #define    kMF3DObjImageDimensions                    MF3DObjectType('i','m','d','m')
  1369. #define    kMF3DObjImageDimensionsText                "ImageDimensions"
  1370.  
  1371. typedef struct MF3DImageDimensionsObj
  1372. {    MF3DObjHeader
  1373.     MF3DUns32            width;
  1374.     MF3DUns32            height;
  1375. } MF3DImageDimensionsObj, *MF3DImageDimensionsObjPtr;
  1376.  
  1377. /*==============================================================================
  1378.  *    ImageMask
  1379.  
  1380.  *    width, height in bits
  1381.  *    0 < width 
  1382.  *    0 < height
  1383.  *    ((width >> 3) + ((width & 0x7) ? 1 : 0)) Û rowBytes
  1384.  *==============================================================================
  1385.  */
  1386. #define    kMF3DObjImageMask                        MF3DObjectType('i','m','m','k')
  1387. #define    kMF3DObjImageMaskText                    "ImageMask"
  1388.  
  1389. typedef struct MF3DImageMaskObj
  1390. {    MF3DObjHeader
  1391.     MF3DUns32            width;
  1392.     MF3DUns32            height;
  1393.     MF3DUns32            rowBytes;
  1394.     MF3DRawDataPtr        image;                /* size: rowBytes * height        */
  1395. } MF3DImageMaskObj, *MF3DImageMaskObjPtr;
  1396.  
  1397. /*==============================================================================
  1398.  *    ImageClearColor
  1399.  *==============================================================================
  1400.  */
  1401. #define    kMF3DObjImageClearColor                    MF3DObjectType('i','m','c','c')
  1402. #define    kMF3DObjImageClearColorText                "ImageClearColor"
  1403.  
  1404. typedef struct MF3DImageClearColorObj
  1405. {    MF3DObjHeader
  1406.     MF3DRGBColor        clearColor;
  1407. } MF3DImageClearColorObj, *MF3DImageClearColorObjPtr;
  1408.  
  1409. /*==============================================================================
  1410.  *    ViewHints
  1411.  *
  1412.  *    Optionally followed by:
  1413.  *        MF3DRendererObjPtr            renderer;            { 0-1 }
  1414.  *        MF3DCameraObjPtr            camera;                { 0-1 }
  1415.  *        MF3DLightsObjPtr            lights;                { 0-many }
  1416.  *        MF3DAttributeSetListObjPtr    attributes;            { 0-1 }
  1417.  *        MF3DImageDimensionsObjPtr    imageDimensions;    { 0-1 }
  1418.  *        MF3DImageMaskObjPtr            imageMask;            { 0-1 }
  1419.  *        MF3DImageClearColorObjPtr    imageClearColor;    { 0-1 }
  1420.  *==============================================================================
  1421.  */
  1422. #define    kMF3DObjViewHints                        MF3DObjectType('v','w','h','n')
  1423. #define    kMF3DObjViewHintsText                    "ViewHints"
  1424.  
  1425. typedef    MF3DVoidObjPtr    MF3DRendererObjPtr;
  1426. typedef    MF3DVoidObjPtr    MF3DCameraObjPtr;
  1427. typedef    MF3DVoidObjPtr    MF3DLightsObjPtr;
  1428.  
  1429. typedef    struct MF3DViewHintsObj
  1430. {    MF3DObjHeader
  1431. } MF3DViewHintsObj, *MF3DViewHintsObjPtr;
  1432.  
  1433. /*==============================================================================
  1434.  *    Shader
  1435.  *
  1436.  *    Optionally followed by:
  1437.  *        MF3DShaderDataObjPtr        shaderData;            { 0-1 }
  1438.  *        MF3DShaderTransformObjPtr    shaderTransform;    { 0-1 }
  1439.  *        MF3DShaderUVTransformObjPtr    shaderUVTransform;    { 0-1 }
  1440.  *==============================================================================
  1441.  */
  1442. typedef    MF3DVoidObjPtr            MF3DShaderDataPtr;
  1443.  
  1444. /*==============================================================================
  1445.  *    UnknownBinary
  1446.  *==============================================================================
  1447.  */
  1448. #define    kMF3DObjUnknownBinary                    MF3DObjectType('u','k','b','n')
  1449. #define    kMF3DObjUnknownBinaryText                "UnknownBinary"
  1450.  
  1451. typedef    struct MF3DUnknownBinaryObj
  1452. {    MF3DObjHeader
  1453.     MF3DInt32            realObjectType;
  1454.     MF3DUns32            realObjectSize;
  1455.     MF3DEndianEnum        realObjectOrder;    /* big endian or little endian    */
  1456.     MF3DRawDataPtr        realObjectData;        /* size: realObjectSize            */
  1457. } MF3DUnknownBinaryObj, *MF3DUnknownBinaryObjPtr;
  1458.  
  1459. /*==============================================================================
  1460.  *    Unknown Type Object
  1461.  *
  1462.  *    Unrecognized objects are just stored as a stream of data.
  1463.  *    We use this object to return User-defined types. We could be even more
  1464.  *    adventurous and use it for any type we do not recognize.
  1465.  *==============================================================================
  1466.  */
  1467.  
  1468. /* Not an official type; so pick a value most likely not to
  1469.  * conflict with other types.
  1470.  */
  1471. #define    kMF3DObjUnknownType                        (MF3DObjType)0x80000000
  1472.  
  1473. /* objectType is kMF3DObjUnknownType.                                        */
  1474. typedef struct MF3DUnknownObj
  1475. {    MF3DObjHeader
  1476.     MF3DObjType                    realObjectType;
  1477.     MF3DCStringPtr                realObjectName;    /* (optional)                */
  1478.     MF3DDataFormatEnum            dataFormat;        /* binary, swapped, or text    */
  1479.     MF3DSize                    size;
  1480.     MF3DRawDataPtr                data;            /* size: size                */
  1481. } MF3DUnknownObj, *MF3DUnknownObjPtr;
  1482.  
  1483. /*==============================================================================
  1484.  *    Unrecognized Subobject List
  1485.  *
  1486.  *    Future versions of the metafile may support new subobject types.
  1487.  *    Unrecognized subobjects are stored in an array.
  1488.  *==============================================================================
  1489.  */
  1490. struct MF3DUnknownSubobjList
  1491. {    MF3DUns32            nSubObjects;
  1492.     MF3DUnknownObjPtr    subObjects;            /* size: nSubObjects            */
  1493. };
  1494.  
  1495. #endif
  1496.